#define DEBUG
#include <cstdio>
#include <cstring>
#include <cassert>

using namespace std;

const int maxr=20, maxq=6;

class Matrix {
public:
  int n, m;
  long double a[63][63];
  
  void mul(const Matrix *x, const Matrix *y) {
    n=x->n, m=y->m;
    for (int i=0; i<n; i++) {
      for (int j=0; j<m; j++) {
	a[i][j] = 0;
	for (int k=0; k<x->m; k++) {
	  a[i][j] += x->a[i][k]*y->a[k][j];
	}
      }
    }
  }

  void initOne(int n) {
    this->n = this->m = n;
    for (int i=0; i<n; i++) {
      a[i][i] = 1;
    }
  }
};

void qpower(Matrix *a, int n) {
  static Matrix p[2], q[2];
  memset(p, 0, sizeof(p));
  memset(q, 0, sizeof(q));
  p[0] = *a;
  q[0].initOne(a->n);
  int i=0, j=0;
  for (; n>1; n/=2) {
    if (n%2) {
      j++;
      q[j%2].mul(&p[i%2], &q[(j-1)%2]);
    }
    i++;
    p[i%2].mul(&p[(i-1)%2], &p[(i-1)%2]);
  }
  a->mul(&p[i%2], &q[j%2]);
}

int initMap(int map[][maxq+1], int r, int q) {
  int t=0;
  for (int i=0; i<=r; i++) {
    if (i>=q-1 && i>0) {
      map[i][q] = t++;
      map[i][q+1] = t++;
    } else {
      for (int j=0; j<=q+1; j++) {
	map[i][j] = t++;
      }
    }
  }
  return t;
}

int map[maxr+1][maxq+1], mapsize;

int min(int a, int b) {
  return a<b ? a : b;
}

void initMatrix(Matrix *a, int r, int q, long double p) {
  a->n = a->m = mapsize;
  for (int j=0; j<=r; j++) {
    a->a[map[j][q+1]][map[j][q+1]] = 1;
    if (j>=q-1) {
      a->a[map[j][q]][map[min(j+1, r)][q]] = p;
      a->a[map[j][q]][map[0][q-1]] = 1-p;
      a->a[map[j][q]][map[j][q+1]] = 1;
    } else {
      for (int k=1; k<=q; k++) {
	if (map[min(j+1, r)][min(k+1, q)]>=0) {
	  a->a[map[j][k]][map[min(j+1, r)][min(k+1, q)]] = p;
	}
	a->a[map[j][k]][map[0][k-1]] = 1-p;
	a->a[map[j][k]][map[j][q+1]] = 1;
      }
    }
  }
}

long double solve(long double p, int n, int r, int q) {
  static Matrix tpl, temp[2];
  memset(&tpl, 0, sizeof(tpl));
  memset(temp, 0, sizeof(temp));
  initMatrix(&tpl, r, q, p);
  temp[0].n = 1, temp[0].m = tpl.m;
  temp[0].a[0][map[0][q]] = 1;
  qpower(&tpl, n);
  temp[1].mul(&temp[0], &tpl);

  long double ans=0;
  for (int i=0; i<=r; i++) {
    ans += temp[1].a[0][map[i][q+1]]*p*min(i+1, r);
  }
  return ans;
}

int main() {
#ifdef DEBUG
  freopen("2867.in", "r", stdin);
  freopen("2867.out", "w", stdout);
#endif
  
  int n, r, q, s;
  scanf("%d %d %d %d", &n, &r, &q, &s);
  memset(map, -1, sizeof(map));
  mapsize=initMap(map, r, q);

  if (solve(1, n, r, q)<=s) {
    printf("Impossible.");
    return 0;
  }
  long double ans=1;
  for (long double left=0, right=1, mid; left<=right; ) {
    const long double eps=1.e-9;
    mid = (left+right)/2;
    if (solve(mid, n, r, q)>s) {
      right = mid-eps;
      ans = mid;
    } else {
      left = mid+eps;
    }
  }

  printf("%.6LF", ans);

  fclose(stdin);
  fclose(stdout);
  return 0;
}
